/**
  * @file	dma.c
  *	@author	yoyoyes
  * @date	2023-6-3
  */
  
#include "dma.h"
#include "usart.h"
#include "gd32f10x.h"

/**
  * @func	hal_dma_ch4_init
  * @param	none
  * @return	none
  */
void hal_dma_ch4_init(void)
{
	dma_parameter_struct dma_init_struct;
	
	rcu_periph_clock_enable(RCU_DMA0);							/* DMA0外设时钟使能 */
	
	dma_deinit(DMA0, DMA_CH4);									/* DMA0通道4复位 */
	dma_init_struct.periph_addr  = USART0 + 4;					/* 外设地址：串口0数据寄存器地址 */
	dma_init_struct.periph_width  = DMA_PERIPHERAL_WIDTH_8BIT;	/* 外设数据宽度：8bit */
	dma_init_struct.memory_addr  = (uint32_t)usart0_rx_buff;	/* 内存地址：串口0数据接收缓冲区 */
	dma_init_struct.memory_width  = DMA_MEMORY_WIDTH_8BIT;		/* 内存数据宽度：8bit */
	dma_init_struct.number  = USART0_DMA_TRANSFER_SIZE;			/* 数据传输总量：要比接收数据大,即不会产生传输完成中断 */
	dma_init_struct.priority  = DMA_PRIORITY_HIGH;				/* 优先级：高 */
	dma_init_struct.periph_inc  = DMA_PERIPH_INCREASE_DISABLE;	/* 外设寻址模式：固定模式 */
	dma_init_struct.memory_inc  = DMA_MEMORY_INCREASE_ENABLE;	/* 内存寻址模式：增量模式 */
	dma_init_struct.direction  = DMA_PERIPHERAL_TO_MEMORY;		/* 数据传输方向：外设到内存 */
	dma_init(DMA0, DMA_CH4, &dma_init_struct);					/* DMA0通道4参数设置 */
	dma_circulation_disable(DMA0, DMA_CH4);						/* DMA0通道4循环模式关闭 */
	dma_channel_enable(DMA0, DMA_CH4);							/* DMA0通道4使能 */
}

/**
  * @func	hal_dma_ch2_init
  * @param	none
  * @return	none
  */
void hal_dma_ch2_init(void)
{
	dma_parameter_struct dma_init_struct;
	
	rcu_periph_clock_enable(RCU_DMA0);							/* DMA0外设时钟使能 */
	
	dma_deinit(DMA0, DMA_CH2);									/* DMA0通道2复位 */
	dma_init_struct.periph_addr  = USART2 + 4;					/* 外设地址：串口2数据寄存器地址 */
	dma_init_struct.periph_width  = DMA_PERIPHERAL_WIDTH_8BIT;	/* 外设数据宽度：8bit */
	dma_init_struct.memory_addr  = (uint32_t)usart2_rx_buff;	/* 内存地址：串口2数据接收缓冲区 */
	dma_init_struct.memory_width  = DMA_MEMORY_WIDTH_8BIT;		/* 内存数据宽度：8bit */
	dma_init_struct.number  = USART2_DMA_TRANSFER_SIZE;			/* 数据传输总量：要比接收数据大,即不会产生传输完成中断 */
	dma_init_struct.priority  = DMA_PRIORITY_HIGH;				/* 优先级：高 */
	dma_init_struct.periph_inc  = DMA_PERIPH_INCREASE_DISABLE;	/* 外设寻址模式：固定模式 */
	dma_init_struct.memory_inc  = DMA_MEMORY_INCREASE_ENABLE;	/* 内存寻址模式：增量模式 */
	dma_init_struct.direction  = DMA_PERIPHERAL_TO_MEMORY;		/* 数据传输方向：外设到内存 */
	dma_init(DMA0, DMA_CH2, &dma_init_struct);					/* DMA0通道2参数设置 */
	dma_circulation_disable(DMA0, DMA_CH2);						/* DMA0通道2循环模式关闭 */
	dma_channel_enable(DMA0, DMA_CH2);							/* DMA0通道2使能 */
}

/**
  * @func	hal_dma_init
  * @param	none
  * @return	none
  */
void gd_hal_dma_init(void)
{
	hal_dma_ch4_init();
	hal_dma_ch2_init(); 
}
